package CutLoad.components.container.states
{
	import CutLoad.Base;
	import CutLoad.CutLoad;
	import CutLoad.components.container.states.StatesItem;
	import CutLoad.cookies.CArray;

	/**
	 * 状态容器,<p>关于状态容器各状态的切换，当前进入一个状态里会调用：StatesItem.main()离开里调用：StatesItem.killMe() </p>
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */	
	public class States extends Base
	{
		private var arr:CArray;
		private var FunChangState:Function;
		//当前的状态
		private var index:Number;
		/**
		 * 初始化 
		 * @param changState 每次切换状态，需要调用的方法 格式：function(当前状态编号:Number);
		 * 
		 */		
		public function States(changState:Function=null)
		{
			arr=new CArray();
			index=-1;
			this.FunChangState=changState;
		}
		/**
		 * 添加一个状态 
		 * @param module  StatesItem实例
		 * 
		 */		
		public function append(module:StatesItem):void{
			arr.add(module,true);
		}
		/**
		 * 一次添加多个状态  
		 * @param arr
		 * 
		 */		
		public function appendSome(arr:Array):void{
			this.arr.data=arr;
		}
		/**
		 * 获得保存状态的内部数组 
		 * @return 
		 * 
		 */		
		public function get data():CArray{
			return arr;
		}
		/**
		 * 每次切换状态，需要调用的方法 
		 * @param fun 格式：function(当前状态编号:Number);
		 * @return 
		 * 
		 */		
		public function setFunChangState(fun:Function):void{
			this.FunChangState=fun;
		}
		/**
		 * 内部有多少个状态 
		 * @return 
		 * 
		 */		
		public function get count():Number{
			return arr.length;
		}
		/**
		 * 设置显示的状态  
		 * @param index 注：从0开始
		 * 
		 */		
		public function set value(index:Number):void{
			if(index==-1) throw new Error("状态容器为空!");
			if(index<0||index>arr.length-1) throw new Error("超出设置范围,取值范围在:"+index+"~"+(arr.length-1));
			if(this.index==index) return;
			if(currentState!=null){
				currentState.killMe();
				if(currentState.parent!=null) this.removeChild(currentState);
			} 
			this.index=index;
			if(currentState.parent==null) this.addChild(currentState);
			currentState.main();
			if(FunChangState!=null){
				try{
					FunChangState(index);
				}catch(e:ArgumentError){
					FunChangState();
				}
			}
		}
		/**
		 * 获得当前的状态 
		 * @return 
		 * 
		 */		
		public function get value():Number{
			if(index==-1) throw new Error("状态容器为空!");
			return this.index;
		}
		/**
		 * 获得当前的状态 
		 * @return 
		 * 
		 */		
		public function get currentState():StatesItem{
			if(index==-1) return null;
			var mm:StatesItem=arr.getOne(this.index) as StatesItem;
			return mm;
		}
	}
}